/**
 *
 */
package com.androidnetframe.httputil;

import android.content.Context;
import android.content.res.AssetManager;
import android.util.Log;
import android.view.View;

import com.lidroid.xutils.BitmapUtils;
import com.lidroid.xutils.HttpUtils;
import com.lidroid.xutils.exception.HttpException;
import com.lidroid.xutils.http.RequestParams;
import com.lidroid.xutils.http.ResponseInfo;
import com.lidroid.xutils.http.callback.RequestCallBack;
import com.lidroid.xutils.http.client.HttpRequest.HttpMethod;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.InputStream;
import java.lang.reflect.Field;

/**
 * @author 何强
 *         2015-8-26
 *         注意：在使用本类时，需要使用到一个Context的参数
 *         需要在Application中暴漏一个Context的参数
 */
public class NetProcessFactory {
    /**
     * 这里配置一个最基本的请求地址：http://www.baidu.com
     */
    private static final String BASE_URL = "http://192.168.21.35:8080/";
    private static HttpUtils client;
    /**
     * 这里存放每个页面的具体请求对象
     */
    public MakeRequestParams makeRequestParams;
    /**
     * 这里存放请求的入口标识
     */
    public String requestURL;
    /**
     * 这里存放请求的方式，比如：get或post
     */
    public int requestMethod;
    /**
     * 这里存放请求的参数
     */
    public RequestParams requestParams;
    /**
     * 这里存放请求的实体类
     */
    public String dataEntity;
    public boolean debug = false;

    public NetProcessFactory() {
        /*创建一个网络请求的工具类*/
        client = new HttpUtils();
        client.configTimeout(10000);//单位：毫秒
    }

    /*对外提供的接口都在这里-----------------------------------------------------------------------------------------*/
    public void setRequestObject(MakeRequestParams makeRequestParams, NetFactoryAccessResult accessResult) {
        this.makeRequestParams = makeRequestParams;
        this.accessResult = accessResult;
        processData();
    }

    /*对外提供的接口都在这里-----------------------------------------------------------------------------------------*/
    private void processData() {
        /*对BaseRequest对象中的数据解析出来，根据里面的参数做相应的事情*/
        /*先确定网络的请求方式*/
        sureRequestMethod();
        /*再确定请求的参数，是否有，或者是什么*/
        sureRequestParams();
        /*对请求的参数进行压缩和加密*/
         /*encryptionForRequestParams();*/
        /*找到请求的入口，真正去网络上请求数据*/
        sureEntryPageName();
        /*将得到的结果进行解析，并返回当前传入页面的实体类对象*/
    }

    private void encryptionForRequestParams() {

    }

    private void sureEntryPageName() {
        /*拼出一个请求的资源入口*/
        String tempEntrypageName = makeRequestParams.entryPageName;
        if (!("".equals(tempEntrypageName))) {
            requestURL = getUrl(tempEntrypageName);

            switch (requestMethod) {
                case 1:
                    client.send(HttpMethod.GET, requestURL, requestParams, new MyRequestCallBack());
                    break;

                case 2:
                    client.send(HttpMethod.POST, requestURL, requestParams, new MyRequestCallBack());
                    break;
            }
        }

    }

    /*本类所使用的方法和接口-----------------------------------------------------------------------------*/
    private void sureRequestParams() {
        requestParams = makeRequestParams.requestParams;
    }

    private void sureRequestMethod() {
        requestMethod = makeRequestParams.requestMethod;
    }

    private String getUrl(String str) {
        int a = Integer.parseInt(str);
        if (this.debug) {
            EntryPageName.debug = true;
        } else {
            EntryPageName.debug = false;
        }
        return EntryPageName.getURL(a);
    }

    /**
     * 这个内部类由本类使用，负责网络请求成功或失败而产生的回调
     */
    public class MyRequestCallBack extends RequestCallBack<String> {

        @Override
        public void onSuccess(ResponseInfo<String> arg0) {
            //Log.e("Test", "Utils-真正请求数据的类： 请求成功");
            if (accessResult != null) {
                if (debug) {
                    accessResult.accessResultSuccess(getTestData());
                } else {
                    accessResult.accessResultSuccess(arg0.result.getBytes());//真实网络数据
                }
            }
        }

        @Override
        public void onFailure(HttpException exception, String descException) {
            //Log.e("Test", "Utils-真正请求数据的类： 请求失败");
            if (accessResult != null) {
                accessResult.accessResultFailed(exception, descException);

                Log.e("Test", "factory_error:" + exception.getExceptionCode() + "?" + exception.getMessage());
            }
        }
    }

    /*本类所使用的方法和接口-----------------------------------------------------------------------------*/
	/*本方法仅做测试用*/
    public byte[] getTestData() {
        EntryPageName obj = new EntryPageName();
        Field[] fields = obj.getClass().getDeclaredFields();
        for (int j = 0; j < fields.length; j++) {
            try {
                if (Integer.parseInt(makeRequestParams.entryPageName) == fields[j].getInt(obj)) {
                    String fileName = fields[j].getName();
                    return getByteArray(fileName + ".json");
                }
            } catch (NumberFormatException e) {
                // TODO Auto-generated catch block
                //e.printStackTrace();
            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                //e.printStackTrace();
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                //e.printStackTrace();
            }

        }
        return null;

    }

    // 从asset中获取指定的文件
    private byte[] getByteArray(String fileName) {

        File file2 = new File(fileName);
        if (!file2.exists()) {
            InputStream open = null;
            try {
                AssetManager assets = makeRequestParams.activity.getAssets();
                open = assets.open(fileName);
                ByteArrayOutputStream output = new ByteArrayOutputStream();

                byte[] buffer = new byte[4096];

                int n = 0;

                while (-1 != (n = open.read(buffer))) {
                    output.write(buffer, 0, n);
                }
                open.close();
                return output.toByteArray();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                return null;
            }
        }
        return null;
    }

    /*这里是对外提供的接口-----------------------------------------------------------------*/
    public NetFactoryAccessResult accessResult;

    public interface NetFactoryAccessResult {
        public void accessResultSuccess(byte[] data);

        public void accessResultFailed(HttpException exception, String descException);
    }

    public void setNetFactoryAccessResult(NetFactoryAccessResult accessResult) {
        this.accessResult = accessResult;
    }

    /*这里是对外提供的方法*/
    public static BitmapUtils loadImageFromNet(Context context, View view, String imageUrl) {
        BitmapUtils bitmapUtils = new BitmapUtils(context);
        // 加载网络图片
        bitmapUtils.display(view, imageUrl);
        return bitmapUtils;
		/*
		// 加载本地图片(路径以/开头， 绝对路径)  
		bitmapUtils.display(testImageView, "/sdcard/test.jpg");  
		// 加载assets中的图片(路径以assets开头)  
		bitmapUtils.display(testImageView, "assets/img/wallpaper.jpg");  
		// 使用ListView等容器展示图片时可通过PauseOnScrollListener控制滑动和快速滑动过程中时候暂停加载图片  
		 * - 																触摸滚动是否暂停加载  快速滚动是否暂停加载
		listView.setOnScrollListener(new PauseOnScrollListener(bitmapUtils, false, true));  
		listView.setOnScrollListener(new PauseOnScrollListener(bitmapUtils, false, true, customListener)); */
    }

    public void setRequestParams(RequestParams params) {
        this.requestParams = params;
    }
   /*这里是对外提供的方法*/
    /*这里是对外提供的接口-----------------------------------------------------------------*/
  
   /*这里提供异常的处理和请求*/
}


 